package com.tao.product.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tao.param.ProductHotParam;
import com.tao.param.ProductIdsParam;
import com.tao.param.ProductSaveParam;
import com.tao.param.ProductSearchParam;
import com.tao.pojo.Product;
import com.tao.to.OrderToProduct;
import com.tao.utils.R;

import java.util.List;

/**
 * @author 86130
 */
public interface ProductService extends IService<Product> {
    /**
     * 根据单类别名称查询热门商品，最多7条数据
     * @param categoryName 类别名称
     * @return r
     */
    R promo(String categoryName);

    /**
     * 多类别人额商品查询，根据类别名称集合至多查询7条
     * @param productHotParam 类别名称集合
     * @return r
     */
    R hots(ProductHotParam productHotParam);

    /**
     * 查询类别商品集合
     * @return
     */
    R cList();

    /**
     * 通用型的业务
     *   传入了类别id，根据id查询并分页
     *   没有传入类别id，查询全部
     * @param productIdsParam
     * @return
     */
    R byCategory(ProductIdsParam productIdsParam);

    /**
     * 根据商品id查询商品详情信息
     * @param productID
     * @return
     */
    R detail(Integer productID);

    /**
     * 查询商品对应的图片详情集合
     * @param productID
     * @return
     */
    R pictures(Integer productID);

    /**
     * 搜索服务调用获取全部商品数据
     * 进行同步
     * @return 商品数据集合
     */
    List<Product> allList();

    /**
     * 搜索业务，需要调用搜素服务
     * @param productSearchParam
     * @return
     */
    R search(ProductSearchParam productSearchParam);

    /**
     * 根据商品id集合查询商品信息
     * @param productIds
     * @return
     */
    R ids(List<Integer> productIds);

    /**
     * 根据商品id查询商品id集合
     * @param productIds
     * @return
     */
    List<Product> cartList(List<Integer> productIds);

    /**
     * 修改库存和增加销售量
     * @param orderToProducts
     */
    void subNumber(List<OrderToProduct> orderToProducts);

    /**
     * 类别对应的商品数量查询
     * @param categoryId
     * @return
     */
    Long adminCount(Integer categoryId);

    /**
     * 商品保存
     * @param productSaveParam
     * @return
     */
    R adminSave(ProductSaveParam productSaveParam);

    /**
     * 商品更新
     * @param product
     * @return
     */
    R adminUpdate(Product product);

    /**
     * 删除商品
     * @param productId
     * @return
     */
    R adminRemove(Integer productId);
}
